package StreamCode;

import java.sql.Array;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamCode1 {
    public static void main(String[] args) {

        /**
         * 1.把所有以 “张” 开头的元素存储到新集合中
         * 2.把 ”张“ 开头的，长度为3的元素再存储到新集合中
         * 3.遍历打印最终结果
         * */
//        ArrayList<String> list1=new ArrayList();
//        list1.add("张无忌");
//        list1.add("周芷若");
//        list1.add("赵敏");
//        list1.add("张强");
//        list1.add("张三丰");

        //name->System.out.println(name)
//        list1.stream().filter(name->name.startsWith("张")).filter(name->name.length()==3).forEach(System.out::println);

        /**
         * Stream流操作流程
         * 1.先得到一条流水线
         * */
//
//        ArrayList<String> list2=new ArrayList<String>();
//        Collections.addAll(list2,"张无忌","周芷若","赵敏","张强","张三丰");
//        //获取数组的流水线对象
//        Stream<String> stream2=list2.stream();
//        stream2.forEach(new Consumer<String>() {
//            @Override
//            public void accept(String s) {
//                System.out.println(s);
//            }
//        });
        //        stream2.filter(name->name.startsWith("张")).filter(name->name.length()==3).forEach(System.out::println);

        /**
         *  双列集合无法直接获取stream流
         *  1.创建双列集合
         *  2.添加数据
         *  3.
         * */
//        HashMap<String,Integer> hm=new HashMap<>();
//
//        hm.put("张无忌",150);
//        hm.put("周芷若",140);
//        hm.put("赵敏",130);
//        hm.put("张强",120);
//        hm.put("张三丰",110);

        // 获取key流
//        hm.keySet().stream().forEach(System.out::println);

        // 获取key+value流 使用entrySet
//        hm.entrySet().stream().forEach(System.out::println);


//        数组获取stream流
//        int[] arr={1,2,3,4,5,6,7,8,9,10};
//        Arrays.stream(arr).forEach(System.out::println);

//        零散数据获取stream流
//        Stream.of("Hello", "World").forEach(System.out::println);

        /**
         * stream接口中静态of方法的细节
         * 方法的形参是一个可变参数，可以传递一堆零散数据，也可以传递数组
         * 但是数组必须是引用数据类型的，如果传递基本数据类型，是会把整个数组当作一个元素。放在stream当中的
         * of中复杂数据类型会自动装箱
         * of中基本数据类型不会自动装箱 所以数组会直接输出数组的地址
         * */

//        int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//        String[] arr2 = {"a", "b", "c", "d", "e"};
//        Stream.of(arr1).forEach(System.out::println); //[I@6d311334
//        Stream.of(arr2).forEach(System.out::println); //a b c d e


        /**
         * stream流只能使用一次，建议使用链式编程
         * 修改stream流中的数据 不会改变原来集合或者数组中的数据
         * limit 获取前几个元素
         * skip 跳过前几个元素
         * */

        /*
         * map 映射
         * 对流中的每个元素进行操作，返回一个新的流
         */
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "a-1", "b-2", "c-3", "d-4", "e-5", "f-6", "g-7", "h-8", "i-9", "j-10");
        // 对流中的每个元素进行操作，返回一个新的流
        list.stream().map(new Function<>() {
            @Override
            public Integer apply(String s) {
                int age = Integer.parseInt(s.split("-")[1]);
                return age;
            }
//                遍历新的流
        }).forEach(System.out::println);
    }
}
